package ip4util

import (
	"net"
	"strconv"
	"strings"
)

// ParseIPRange 解析字符串描述的连续IP地址段
// 格式："192.168.1.1,192.168.1.2-5,192.168.1.10-192.168.1.20"
func ParseIPRange(s string) []net.IP {
	s = strings.TrimSpace(s)
	if s == "" {
		return nil
	}

	ipAddrs := make([]net.IP, 0, 128)

	for _, s := range strings.Split(s, ",") {
		ips := parseIPRange(strings.TrimSpace(s))
		if len(ips) == 0 {
			return nil
		}

		ipAddrs = append(ipAddrs, ips...)
	}

	return ipAddrs
}

func parseIPRange(s string) []net.IP {
	ipAddrs := make([]net.IP, 0, 256)

	s = strings.TrimSpace(s)
	parts := strings.SplitN(s, "-", 2)
	if len(parts) == 0 {
		return nil
	}

	// 第一个地址
	ipAddrs = append(ipAddrs, net.ParseIP(parts[0]).To4())

	// end
	if len(parts) == 2 {
		startIP := ipAddrs[0].To4()

		// end是一个数字
		endNum, err := strconv.Atoi(parts[1])
		if err == nil {
			if endNum < int(startIP[3]) || endNum > 0xff {
				return nil
			}

			staNum := int(startIP[3])
			for i := staNum + 1; i <= endNum; i++ {
				ipAddrs = append(ipAddrs, net.IPv4(startIP[0], startIP[1], startIP[2], byte(i)).To4())
			}

			return ipAddrs
		}

		// end是一个 ip 地址
		endIP := net.ParseIP(parts[1])
		startIPInt, endIPInt := IP2Int(ipAddrs[0]), IP2Int(endIP)
		if startIPInt > endIPInt {
			return nil
		}
		for i := startIPInt + 1; i <= endIPInt; i++ {
			ipAddrs = append(ipAddrs, Int2IP(i).To4())
		}
		return ipAddrs
	}

	return ipAddrs
}
